home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / WORDPAD.PAK / FORMATTA.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  6KB  |  268 lines

  1. // formatta.cpp : implementation file
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1995 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "wordpad.h"
  15. #include "formatta.h"
  16. #include "ddxm.h"
  17. #include "helpids.h"
  18.  
  19. #ifdef _DEBUG
  20. #undef THIS_FILE
  21. static char BASED_CODE THIS_FILE[] = __FILE__;
  22. #endif
  23.  
  24. const DWORD CFormatTabDlg::m_nHelpIDs[] = 
  25. {
  26.     IDC_BUTTON_SET, IDH_WORDPAD_TABSET,
  27.     IDC_BUTTON_CLEAR, IDH_WORDPAD_TABCLEAR,
  28.     IDC_BUTTON_CLEARALL, IDH_WORDPAD_TAB_CLEARALL,
  29.     IDC_COMBO1, IDH_WORDPAD_TABSTOPS,
  30.     IDC_BOX, IDH_COMM_GROUPBOX,
  31.     0, 0
  32. };
  33.  
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CFormatTabDlg dialog
  36.  
  37. CFormatTabDlg::CFormatTabDlg(PARAFORMAT& pf, CWnd* pParent /*=NULL*/)
  38.     : CCSDialog(CFormatTabDlg::IDD, pParent)
  39. {
  40.     m_pf = pf;
  41.     m_tabarray = new LONG[MAX_TAB_STOPS];
  42.     m_nCount = 0;
  43.     if (m_pf.dwMask & PFM_TABSTOPS)
  44.     {
  45.         m_nCount = m_pf.cTabCount;
  46.         ASSERT(m_pf.cTabCount <= MAX_TAB_STOPS);
  47.         for (int i=0;i<m_pf.cTabCount;i++)
  48.             m_tabarray[i] = m_pf.rgxTabs[i];
  49.     }
  50.     
  51.     //{{AFX_DATA_INIT(CFormatTabDlg)
  52.     //}}AFX_DATA_INIT
  53. }
  54.  
  55. CFormatTabDlg::~CFormatTabDlg()
  56. {
  57.     delete [] m_tabarray;
  58. }
  59.  
  60. void CFormatTabDlg::DoDataExchange(CDataExchange* pDX)
  61. {
  62.     CCSDialog::DoDataExchange(pDX);
  63.     //{{AFX_DATA_MAP(CFormatTabDlg)
  64.     DDX_Control(pDX, IDC_BUTTON_CLEARALL, m_buttonClearAll);
  65.     DDX_Control(pDX, IDC_BUTTON_SET, m_buttonSet);
  66.     DDX_Control(pDX, IDC_BUTTON_CLEAR, m_buttonClear);
  67.     DDX_Control(pDX, IDC_COMBO1, m_comboBox);
  68.     //}}AFX_DATA_MAP
  69.     if (!pDX->m_bSaveAndValidate)
  70.         UpdateListBox();
  71. }
  72.  
  73. BEGIN_MESSAGE_MAP(CFormatTabDlg, CCSDialog)
  74.     //{{AFX_MSG_MAP(CFormatTabDlg)
  75.     ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnClickedClear)
  76.     ON_BN_CLICKED(IDC_BUTTON_CLEARALL, OnClickedClearAll)
  77.     ON_BN_CLICKED(IDC_BUTTON_SET, OnClickedSet)
  78.     ON_CBN_EDITCHANGE(IDC_COMBO1, OnEditChange)
  79.     ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchange)
  80.     //}}AFX_MSG_MAP
  81. END_MESSAGE_MAP()
  82.  
  83.  
  84. /////////////////////////////////////////////////////////////////////////////
  85. // CFormatTabDlg message handlers
  86.  
  87. void CFormatTabDlg::OnClickedClear()
  88. {
  89.     int nTab;
  90.     int nSel = m_comboBox.GetCurSel();
  91.     if (nSel == CB_ERR)
  92.     {
  93.         CDataExchange dx(this, TRUE);
  94.         DDX_Twips(&dx, IDC_COMBO1, nTab);
  95.         DDV_MinMaxTwips(&dx, nTab, 0, 31680);
  96.         if (nTab != DDXM_BLANK)
  97.         {
  98.                 if (RemoveTabFromArray(nTab))
  99.                     UpdateListBox();
  100.         }
  101.     }
  102.     else
  103.     {
  104.         ASSERT(nSel < m_nCount);
  105.         RemoveTabFromArrayByIndex(nSel);
  106.         UpdateListBox();
  107.     }
  108.     UpdateButtons();
  109.     SetEditFocus();
  110. }
  111.  
  112. void CFormatTabDlg::OnClickedClearAll()
  113. {
  114.     m_nCount = 0;
  115.     m_comboBox.ResetContent();
  116.     UpdateButtons();
  117.     SetEditFocus();
  118. }
  119.  
  120. void CFormatTabDlg::OnClickedSet()
  121. {
  122.     Set();
  123.     UpdateButtons();
  124.     SetEditFocus();
  125. }
  126.  
  127. BOOL CFormatTabDlg::Set()
  128. {
  129.     int nTab;
  130.     CDataExchange dx(this, TRUE);
  131.     DDX_Twips(&dx, IDC_COMBO1, nTab);
  132.     DDV_MinMaxTwips(&dx, nTab, 0, 31680);
  133.     if (nTab != DDXM_BLANK)
  134.     {
  135.         if (m_nCount == MAX_TAB_STOPS)
  136.         {
  137.             AfxMessageBox(IDS_NOMORETABS);
  138.             m_comboBox.Clear();
  139.             return FALSE;
  140.         }
  141.         if (AddTabToArray(nTab))
  142.             UpdateListBox();
  143.         return TRUE;
  144.     }
  145.     return FALSE;
  146. }
  147.  
  148. void CFormatTabDlg::SetEditFocus()
  149. {
  150.     m_comboBox.SetFocus();
  151.     m_comboBox.SetEditSel(0,-1);
  152. }
  153.  
  154. BOOL CFormatTabDlg::RemoveTabFromArray(LONG lTab)
  155. {
  156.     int i;
  157.     for (i=0;i<m_nCount;i++)
  158.     {
  159.         if (m_tabarray[i] == lTab)
  160.         {
  161.             RemoveTabFromArrayByIndex(i);
  162.             return TRUE;
  163.         }
  164.     }
  165.     return FALSE;
  166. }
  167.  
  168. void CFormatTabDlg::RemoveTabFromArrayByIndex(int nIndex)
  169. {
  170.     memmove(&m_tabarray[nIndex], &m_tabarray[nIndex+1], 
  171.         (m_nCount-nIndex-1)*sizeof(LONG));
  172.     m_nCount--;
  173. }
  174.  
  175. BOOL CFormatTabDlg::AddTabToArray(LONG lTab)
  176. {
  177.     int i;
  178.     BOOL bInsert = FALSE;
  179.     LONG lTemp;
  180.     for (i=0;i<m_nCount;i++)
  181.     {
  182.         if (!bInsert && lTab < m_tabarray[i])
  183.             bInsert = TRUE;
  184.         else if (lTab == m_tabarray[i]) // we don't want repeats
  185.             return FALSE;
  186.         if (bInsert)
  187.         {
  188.             lTemp = m_tabarray[i];
  189.             m_tabarray[i] = lTab;
  190.             lTab = lTemp;
  191.         }
  192.     }
  193.     m_tabarray[m_nCount++] = lTab;
  194.     return TRUE;
  195. }
  196.  
  197. void CFormatTabDlg::UpdateListBox()
  198. {
  199.     int i;
  200.     TCHAR szT[64];
  201.     ASSERT(m_nCount >= 0);
  202.     m_comboBox.ResetContent();
  203.     for (i=0;i<m_nCount;i++)
  204.     {   
  205.         theApp.PrintTwips(szT, m_tabarray[i], 2);
  206.         m_comboBox.AddString(szT);
  207.     }
  208. }
  209.  
  210. void CFormatTabDlg::OnOK()
  211. {
  212.     if (m_buttonSet.IsWindowEnabled())
  213.     {
  214.         if (!Set())
  215.             return;
  216.     }
  217.     CCSDialog::OnOK();
  218.     m_pf.cTabCount = (SHORT) m_nCount;
  219.     for (int i=0;i<m_nCount;i++)
  220.         m_pf.rgxTabs[i] = m_tabarray[i];
  221.     m_pf.dwMask = PFM_TABSTOPS;
  222. }
  223.  
  224. void CFormatTabDlg::OnEditChange() 
  225. {
  226.     UpdateButtons();
  227. }
  228.  
  229. void CFormatTabDlg::UpdateButton(CButton& button, BOOL b)
  230. {
  231.     if (b != button.IsWindowEnabled())
  232.         button.EnableWindow(b);
  233. }
  234.  
  235. void CFormatTabDlg::UpdateButtons()
  236. {
  237.     UpdateButton(m_buttonClearAll, m_nCount > 0);
  238.     BOOL bHasText = (m_comboBox.GetWindowTextLength() > 0);
  239.     UpdateButton(m_buttonSet, bHasText);
  240.     UpdateButton(m_buttonClear, bHasText);
  241.     WORD wID = LOWORD(GetDefID());
  242.     if (bHasText && wID != IDC_BUTTON_SET)
  243.         SetDefID(IDC_BUTTON_SET);
  244.     else if (!bHasText && wID != IDOK)
  245.         SetDefID(IDOK);
  246. }
  247.  
  248. BOOL CFormatTabDlg::OnInitDialog() 
  249. {
  250.     CCSDialog::OnInitDialog();
  251.     UpdateButtons();
  252.     return TRUE;  // return TRUE unless you set the focus to a control
  253.                   // EXCEPTION: OCX Property Pages should return FALSE
  254. }
  255.  
  256. void CFormatTabDlg::OnSelchange() 
  257. {
  258.     UpdateButton(m_buttonClearAll, m_nCount > 0);
  259.     // force these since if the edit control is empty and 
  260.     // an item in the box is clicked on, the edit control will
  261.     // not be filled in first
  262.     UpdateButton(m_buttonSet, TRUE);
  263.     UpdateButton(m_buttonClear, TRUE);
  264.     WORD wID = LOWORD(GetDefID());
  265.     if (wID != IDC_BUTTON_SET)
  266.         SetDefID(IDC_BUTTON_SET);
  267. }
  268.